package controller

import (
	"bluebell/logic"
	"bluebell/models"
	"strconv" // 导入 strconv 包

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// parsePostIDFromRequest 用于解析请求中的 PostID，并将其转换为 int64
func parsePostIDFromRequest(c *gin.Context, req models.LikeRequest) (int64, error) {
	postID, err := strconv.ParseInt(req.PostID, 10, 64)
	if err != nil {
		zap.L().Error("帖子ID格式错误", zap.String("postID_str", req.PostID), zap.Error(err))
		ResponseError(c, models.CodeInvalidParam)
	}
	return postID, err
}

// LikePostHandler 处理点赞请求
// @Summary 处理点赞请求
// @Description 用户点赞指定帖子
// @Tags 点赞相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string true "Bearer JWT"
// @Param object body models.LikeRequest true "点赞请求"
// @Security ApiKeyAuth
// @Success 200 {object} models.ResponseSuccess{data=models.LikeExistsResponse}
// @Failure 400 {object} models.ResponseError
// @Failure 500 {object} models.ResponseError
// @Router /like [post]
func LikePostHandler(c *gin.Context) {
	// 1. 解析请求参数
	var req models.LikeRequest // req.PostID 现在是 string
	if err := c.ShouldBindJSON(&req); err != nil {
		zap.L().Error("点赞请求参数无效", zap.Error(err))
		ResponseError(c, models.CodeInvalidParam)
		return
	}

	// 转换为 int64
	postID, err := parsePostIDFromRequest(c, req)
	if err != nil {
		return // parsePostIDFromRequest 内部已处理错误响应
	}

	// 2. 获取当前用户ID
	userID, err := getCurrentUserID(c)
	if err != nil {
		ResponseError(c, models.CodeNeedLogin)
		return
	}

	// 3. 处理点赞业务
	// 传递 int64 类型的 postID 给 logic 层
	exists, err := logic.LikePost(userID, postID) // 修改这里，直接传递 postID (int64)
	if err != nil {
		zap.L().Error("点赞操作失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID), // 日志中也使用 int64 类型的 postID
			zap.Error(err))

		if err == logic.ErrorPostNotExist {
			ResponseError(c, models.CodePostNotExist)
		} else {
			ResponseError(c, models.CodeServerBusy)
		}
		return
	}

	// 4. 返回响应
	ResponseSuccess(c, models.LikeExistsResponse{
		Exists: exists,
	})
}

// UnlikePostHandler 取消点赞请求
// @Summary 取消点赞请求
// @Description 用户取消点赞指定帖子
// @Tags 点赞相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string true "Bearer JWT"
// @Param object body models.LikeRequest true "取消点赞请求"
// @Security ApiKeyAuth
// @Success 200 {object} models.ResponseSuccess{data=models.LikeExistsResponse}
// @Failure 400 {object} models.ResponseError
// @Failure 500 {object} models.ResponseError
// @Router /like [delete]
func UnlikePostHandler(c *gin.Context) {
	// 1. 解析请求参数
	var req models.LikeRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		zap.L().Error("取消点赞请求参数无效", zap.Error(err))
		ResponseError(c, models.CodeInvalidParam)
		return
	}

	// 转换为 int64
	postID, err := parsePostIDFromRequest(c, req)
	if err != nil {
		return // parsePostIDFromRequest 内部已处理错误响应
	}

	// 2. 获取当前用户ID
	userID, err := getCurrentUserID(c)
	if err != nil {
		ResponseError(c, models.CodeNeedLogin)
		return
	}

	// 3. 处理取消点赞业务
	// 传递 int64 类型的 postID 给 logic 层
	exists, err := logic.UnlikePost(userID, postID) // 修改这里
	if err != nil {
		zap.L().Error("取消点赞操作失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID), // 日志中也使用 int64 类型的 postID
			zap.Error(err))

		if err == logic.ErrorPostNotExist {
			ResponseError(c, models.CodePostNotExist)
		} else {
			ResponseError(c, models.CodeServerBusy)
		}
		return
	}

	// 4. 返回响应
	ResponseSuccess(c, models.LikeExistsResponse{
		Exists: exists,
	})
}

// ToggleLikeHandler 切换点赞状态
// @Summary 切换点赞状态
// @Description 用户切换帖子的点赞状态（点赞/取消点赞）
// @Tags 点赞相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string true "Bearer JWT"
// @Param object body models.LikeRequest true "切换点赞请求"
// @Security ApiKeyAuth
// @Success 200 {object} models.ResponseSuccess{data=models.LikeExistsResponse}
// @Failure 400 {object} models.ResponseError
// @Failure 500 {object} models.ResponseError
// @Router /like/toggle [post]
func ToggleLikeHandler(c *gin.Context) {
	// 1. 解析请求参数
	var req models.LikeRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		zap.L().Error("切换点赞状态请求参数无效", zap.Error(err))
		ResponseError(c, models.CodeInvalidParam)
		return
	}

	// 转换为 int64
	postID, err := parsePostIDFromRequest(c, req)
	if err != nil {
		return // parsePostIDFromRequest 内部已处理错误响应
	}

	// 2. 获取当前用户ID
	userID, err := getCurrentUserID(c)
	if err != nil {
		ResponseError(c, models.CodeNeedLogin)
		return
	}

	// 3. 处理切换点赞状态
	// 传递 int64 类型的 postID 给 logic 层
	exists, err := logic.ToggleLike(userID, postID) // 修改这里
	if err != nil {
		zap.L().Error("切换点赞状态失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID), // 日志中也使用 int64 类型的 postID
			zap.Error(err))

		if err == logic.ErrorPostNotExist {
			ResponseError(c, models.CodePostNotExist)
		} else {
			ResponseError(c, models.CodeServerBusy)
		}
		return
	}

	// 4. 返回响应
	ResponseSuccess(c, models.LikeExistsResponse{
		Exists: exists,
	})
}

// CheckLikeStatusHandler 检查点赞状态
// @Summary 检查点赞状态
// @Description 检查当前用户是否点赞了指定帖子
// @Tags 点赞相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string true "Bearer JWT"
// @Param post_id path int true "帖子ID"
// @Security ApiKeyAuth
// @Success 200 {object} models.ResponseSuccess{data=models.LikeStatusResponse}
// @Failure 400 {object} models.ResponseError
// @Failure 500 {object} models.ResponseError
// @Router /like/status/{post_id} [get]
func CheckLikeStatusHandler(c *gin.Context) {
	// 1. 获取帖子ID
	pidStr := c.Param("post_id")
	postID, err := strconv.ParseInt(pidStr, 10, 64)
	if err != nil {
		zap.L().Error("无效的帖子ID",
			zap.String("post_id", pidStr),
			zap.Error(err))
		ResponseError(c, models.CodeInvalidParam)
		return
	}

	// 2. 获取当前用户ID
	userID, err := getCurrentUserID(c)
	if err != nil {
		ResponseError(c, models.CodeNeedLogin)
		return
	}

	// 3. 检查点赞状态
	liked, err := logic.CheckLikeExists(userID, postID)
	if err != nil {
		zap.L().Error("检查点赞状态失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID),
			zap.Error(err))
		ResponseError(c, models.CodeServerBusy)
		return
	}

	// 4. 返回响应
	ResponseSuccess(c, models.LikeStatusResponse{
		Liked: liked,
	})
}
